package practica1.actions;

import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import javax.swing.AbstractAction;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import practica1.Practica1;
import practica1.controller.Controller;
import practica1.language.Language;
import practica1.language.LanguageEvent;
import practica1.language.LanguageListener;
import practica1.logic.LogicExperimento;
import practica1.manejoExperimento.ManejoExperimento;
import practica1.manejoExperimento.ManejoExperimentoAdapter;
import practica1.ui.dialog.DialogNuevoExperimento;

/**
 * Clase que implementa la acción de crear un nuevo excperimento
 * @author Miguel González - Ceura
 */
public class ActionNuevoExperimento extends AbstractAction implements LanguageListener {
    private LogicExperimento nuevoExp;
    
    /**
     * Constructor de la clase
     */
    public ActionNuevoExperimento() {
        super(Language.getI().getP("NUEVO_EXPERIMENTO"), null);
        
        putValue(SHORT_DESCRIPTION, Language.getI().getP("NUEVO_EXPERIMENTO"));
        putValue(NAME, Language.getI().getP("NUEVO_EXPERIMENTO"));
        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_N, 
                InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK));
        putValue(MNEMONIC_KEY, Integer.valueOf(KeyEvent.VK_N));
        putValue(SELECTED_KEY, Boolean.TRUE); 
        
        initListeners();
    }
    
    private void initListeners() {
        Language.getI().addLanguageListener(this);     
    }
    
    /**
     * Cuando sucede la acción nos encargamos de crear un nuevo experimento,
     * para ello se muestra una nueva ventana modal para preguntar por los 
     * datos del mismo
     * @param e ActionEvent Evento producido
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        DialogNuevoExperimento dialog = new DialogNuevoExperimento(
                Practica1.getInstance());
        dialog.setVisible(true);
        if(dialog.getAction() == DialogNuevoExperimento.ACEPTAR) {
            String rutaFichero = dialog.getRutaExperimento() + "/" +
                    dialog.getNombreExperimento();
            
            File fichExp = new File(rutaFichero);
            String nombreExp = dialog.getNombreExperimento();
            String tipoBacteria = dialog.getTipoBacteria();
            String nombreInvestigador = dialog.getNombreInvestigador();
            String proyectoInvestigacion = dialog.getProyectoInvestigacion();
            int numDias = dialog.getNumDiasExperimento();
            int limiteMaximo = dialog.getLimiteAlimentacionMaxima();
            String unidades = dialog.getUnidadesMedida();
            
            nuevoExp = new
                    LogicExperimento(fichExp, nombreExp, tipoBacteria, 
                    nombreInvestigador, proyectoInvestigacion, numDias,
                    limiteMaximo, unidades, dialog.isGuardarBD());

            
            //Guardamos el experimento
            ManejoExperimento.guardarExperimento(nuevoExp, 
                    new EscuchadorGuardado());
        }
    }

    /**
     * Al cambiar el idioma actualizamos el nombre y la descripción
     * @param evt LanguageEvent
     */
    @Override
    public void idiomaChange(LanguageEvent evt) {
        putValue(SHORT_DESCRIPTION, Language.getI().getP("NUEVO_EXPERIMENTO"));
        putValue(NAME, Language.getI().getP("NUEVO_EXPERIMENTO"));
    }
    
    private class EscuchadorGuardado extends ManejoExperimentoAdapter {
        @Override
        public void guardadoExperimento(LogicExperimento exp) {
            if(exp.equals(nuevoExp)) {
                //Lo agregamos al modelo
                Controller.getInstance().addExperimento(exp);
            }
        }

        @Override
        public void errorGuardado(LogicExperimento exp) {
            Practica1.log.error(Language.getI().getP("ERROR") +
                    "Error guardando el nuevo experimento");
            
            JOptionPane.showMessageDialog(Practica1.getInstance(),
                Language.getI().getP("PROBLEMA_CREAR_EXPERIMENTO"),
                Language.getI().getP("ERROR"),
                JOptionPane.ERROR_MESSAGE);    
        }
    }
}
